package adke.gui.panels;

import adke.gui.Consistency;
import adke.gui.Overview;
import adke.managers.InputManager;
import adke.managers.PlayerManager;
import adke.models.ControlSet;
import adke.models.Player;
import info.clearthought.layout.TableLayout;
import info.clearthought.layout.TableLayoutConstraints;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.*;

import static java.awt.event.KeyEvent.*;
import javax.swing.JTextArea;

// paneel waarin je hoeveelheid spelers kan kiezen enzo, en kleuren

public class Init extends JPanel
{
    // tablelayout: https://tablelayout.dev.java.net/
    // hier werk ik eigenlijk alleen maar mee, omdat deze gewoon de beter is dan de java alternatieven
    private TableLayout layout;
    
    // dit paneel bestaat steeds uit balken met spelereigenschappen, net als in het origineel
    // we beginnen met twee spelers
    
    // dit zijn de spelerwaarden die ineen balk staan:
    // kleur
    // naam
    // controls
    
    private static int balkHeight = 50;
    
    // hebben we hier nodig zodat we van buiten addPlayer kunnen aanroepen
    // namelijk vanuit de HotKeyListener
    private PlayerList playerList;
    
    public Init()
    {
        setBackground(Color.black); // vet authentiek!
        
        double[][] size = { {10, TableLayout.FILL, 10}, {10, 150, 10, TableLayout.FILL} };
        setLayout(new TableLayout(size));
        
        playerList = new PlayerList();
        
        add(new Explanation(), "1, 1");
        add(playerList, "1, 3");
    }
    
    // paneelte aan de bovenkant dat uitlegt wat de knoppen zijn
    // om een speler toe te voegen en te verwijderen
    private class Explanation extends JPanel
    {
        public Explanation()
        {
            setBackground(Color.black);
            setLayout(new GridLayout());
            
            
            JLabel label = new JLabel("Druk op 'Enter' om een speler toe te voegen en op de 'Powerup' toets om je speler te verwijderen.");
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setForeground(Color.white);
            label.setFont(Consistency.getFont());
            
            // poging om te line wrappen als het venster te klein is
            /*
            JTextArea label = new JTextArea();
            label.setText("Druk op 'Enter' om een speler toe te voegen en op de 'Powerup' toets om je speler te verwijderen.");
            label.setBackground(Color.BLACK);
            label.setForeground(Color.WHITE);
            label.setFont(Consistency.getFont());
            */
            
            add(label);
        }
    }
    
    private class PlayerList extends JPanel
    {
        public PlayerList()
        {
            setBackground(Color.black);
            
            // init tablelayout waarden
            // de eerste array zijn de x waarden van de tabel
            // de tweede zijn de y waarden, en samen is het een tabel
            double[][] size = 
            { 
                // x-waarden
                {TableLayout.FILL, 100, 5, TableLayout.PREFERRED, 5, TableLayout.PREFERRED, TableLayout.FILL}, 

                // y waarden
                {10} // scheiding met uitleg
            };

            layout = new TableLayout(size);
            setLayout(layout);

            // maak eerste twee balken
            addPlayer(); addPlayer();
        }
        
        // voeg een balk aan de GUI toe met een nieuwe speler
        public void addPlayer()
        {        
            Player player = PlayerManager.newPlayer();
            addPlayer(player);
        }
        
        private void addPlayer(Player player)
        {
            // max inputs bereikt
            if (player == null) return;
            
            // maak panelen met waarden van player
            ColorPanel color = new ColorPanel(player.getColor());
            NamePanel name = new NamePanel(player.getName());
            ControlsPanel controls = new ControlsPanel(player.getControls());
            
             // insert player bovenin
            layout.insertRow(1, balkHeight);
            layout.insertRow(2, 10);

            // hoogte van het frame
            int frameHeight = Overview.getInstance().getHeight(); // geeft de absolute schermhoogte, niet de echte framehoogte
            
            // uitleg = 170
            int playerCnt = PlayerManager.getPlayerCount();
            int curHeight = (playerCnt * balkHeight) + (playerCnt * 10) + 180 + 64; // 180 is de groote van de explanation die
                                                                                    // erbij komt. 64 is 2x de groote van de windows taakbalk
                                                                                    // aangezien linux vaak er ook nog een aan de bovenkant heeft
            
            // als er meer spelers zijn dan het scherm kan laten zien, 
            if (curHeight > frameHeight)
            {
                // maak de balken kleiner
                balkHeight = balkHeight - 10;
                resizeBalken();
            }
            
            add(color, new TableLayoutConstraints(1, 1, 1, 1, TableLayout.FULL, TableLayout.FULL));
            add(name, new TableLayoutConstraints(3, 1, 3, 1, TableLayout.FULL, TableLayout.FULL));
            add(controls, new TableLayoutConstraints(5, 1, 5, 1, TableLayout.FULL, TableLayout.FULL));
            
            revalidate();
        }
        
        // stel dat er zich meer spelers aanmelden dan op het scherm passen,
        // ( een standaard spelerbalk is 50pix) dan verkleinen we de balken met 10pix
        // en vernieuwen we de tablelayout
        private void resizeBalken()
        {
            for (int i = 0; i < PlayerManager.getPlayerCount(); i++)
            {
                // * 2 omdat er telkens een tweede rij wordt toegevoegd van 10pix
                // als spacer
                layout.setRow(i*2 + 1, balkHeight);
            }
            
            // zonder dit is de verandering niet zichtbaar
            revalidate();
        }
        
        public void refresh()
        {
            // verwijder alle rijen van de playerpanel
            int rowCount = (layout.getNumRow());
            for (int i = 1; i < rowCount; i++) // sla de scheiding row over
            {
                layout.deleteRow(rowCount-i); // loop terug, want anders gaan we over de grens heen die we steeds korter maken
            }
            
            // nu voegen we de spelers in volgorde weer toe
            Player[] players = PlayerManager.getPlayers();
            
            for (Player player : players)
            {
                addPlayer(player);
            }
            
            revalidate();
        }
    }
    
    // wordt geroepen door luisteraar van ENTER toets
    // voegt slechts een rij toe, doet geen refresh
    public void addPlayer()
    {
        playerList.addPlayer();
    }

    // verwijderd alle rijen en voegt ze opnieuw allemaal in
    public void refreshPlayerList()
    {
        playerList.refresh();
    }
}
